#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
day 22 homework
"""

# 1.请使用面向对象实现栈（后进先出）
"""
class Foo(object):
    def __init__(self):
        self.data_list = list()

    def push(self, item):
        self.data_list.append(item)

    def pop(self):
        self.data_list.pop()


v1= Foo()
v1.push('alex')
print(v1.data_list)
v1.push('wusir')
print(v1.data_list)
v1.push('eric')
print(v1.data_list)

v1.pop()
print(v1.data_list)
v1.pop()
print(v1.data_list)
v1.pop()
print(v1.data_list)
"""

# 2.请是用面向对象实现队列（先进先出）
"""
class Foo(object):
    def __init__(self):
        self.data_list = list()

    def push(self, item):
        self.data_list.append(item)

    def pop(self):
        self.data_list.pop(0)


v1= Foo()
v1.push('alex')
print(v1.data_list)
v1.push('wusir')
print(v1.data_list)
v1.push('eric')
print(v1.data_list)

v1.pop()
print(v1.data_list)
v1.pop()
print(v1.data_list)
v1.pop()
print(v1.data_list)
"""

# 3.如何实现一个可迭代对象？
"""
class Foo(object):
    def __item__(self):
        yield 1
        yield 2
        yield 3
        yield 4
        yield 5
        yield 6

v1 = Foo()
v = v1.__item__()
for i in v:
    print(i)
"""

# 4.看代码写结果
"""
class Foo(object):

    def __init__(self):
        self.name = '武沛齐'
        self.age = 100


obj = Foo()
setattr(Foo, 'email', 'wupeiqi@xx.com')

v1 = getattr(obj, 'email')
v2 = getattr(Foo, 'email')

print(v1, v2)
# wupeiqi@xx.com wupeiqi@xx.com
"""

# 5.请补充代码（提：循环的列表过程中如果删除列表元素，会影响后续的循环，推荐：可以尝试从后向前找）
"""
li = ['李杰', '李魔头', '女神', '金鑫', '王李', '武沛齐', '李必胜', '李烫头', '邵海鹏', '张锶达', '李大头鱼']

name = input('请输入要删除的姓氏：')  # 如输入“李”，则删除所有姓李的人。
# 请补充代码
class Foo(object):
    def val(self, name):
        for i in range(len(li), 0, -1):
            if li[i - 1].strip().startswith(name):
                li.remove(li[i - 1])

v1 = Foo()
v1.val(name)
print(li)
"""

# 6.有如下字典，请删除指定数据。
"""
class User(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

info = [User('武沛齐', 19), User('李杰', 73), User('景女神', 16)]

name = input('请输入要删除的用户姓名：')
# 请补充代码将指定用户对象再info列表中删除。
class Remove(object):
    def remove(self, name):
        for i in range(len(info)):
            if name == info[i - 1].__dict__['name']:
                info.remove(info[i - 1])

v1 = Remove()
v1.remove(name)
for i in range(len(info)):
    print(info[i].__dict__)
"""

# 7.补充代码实现：校园管理系统。
'''
import sys, re


class User(object):
    def __init__(self, name, email, age):
        self.name = name
        self.email = email
        self.age = age

    def __str__(self):
        return self.name


class School(object):
    """学校"""

    def __init__(self):
        # 员工字典，格式为：{"销售部": [用户对象,用户对象,] }
        self.user_dict = {}

    def invite(self, department, user_object):
        """
        招聘，到用户信息之后，将用户按照指定结构添加到 user_dict结构中。
        :param department: 部门名称，字符串类型。
        :param user_object: 用户对象，包含用户信息。
        :return:
        """
        if department in self.user_dict:
            self.user_dict[department].append(user_object)
        else:
            self.user_dict[department] = [user_object]
        print(self.user_dict)
        print('登记成功！')

    def dimission(self, username, department=None):
        """
        离职，讲用户在员工字典中移除。
        :param username: 员工姓名
        :param department: 部门名称，如果未指定部门名称，则遍历找到所有员工信息，并将在员工字典中移除。
        :return:
        """
        if department:
            for i in self.user_dict[department]:
                if i.name == username:
                    self.user_dict[department].remove(i)
        else:
            for i in self.user_dict:
                for j in self.user_dict[i]:
                    if j.name == username:
                        self.user_dict[i].remove(j)

        print(self.user_dict)
        print('申请离职成功！')

    def run(self):
        """
        主程序
        :return:
        """
        while True:
            print('##################首页################\n', '1.招聘\n', '2.离职')
            num = input('请输入序号（N退出）：')
            if num.upper() == 'N':
                sys.exit('谢谢使用！')
            if num == '1':
                name = input('请输入姓名：')
                email = input('请输入邮箱：')
                age = input('请输入年龄：')
                department = input('请输入部门：')
                if not re.match(r'^[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}$', email):
                    print('错误的邮箱格式！')
                    continue
                obj.invite(department, User(name, email, age))
            elif num == '2':
                name = input('请输入姓名：')
                department = input('请输入部门：')
                if department:
                    obj.dimission(name, department)
                else:
                    obj.dimission(name)
            else:
                print('输入有误')
                continue


if __name__ == '__main__':
    obj = School()
    obj.run()
'''

# 8.请编写网站实现如下功能。
"""
需求：

实现 MIDDLEWARE_CLASSES 中的所有类，并约束每个类中必须有process方法。

用户访问时，使用importlib和反射 让 MIDDLEWARE_CLASSES 中的每个类对 login、logout、index 方法的返回值进行包装，最终让用户看到包装后的结果。
如：

用户访问 : http://127.0.0.1:8000/login/ ，
页面显示： 【csrf】【auth】【session】 登录 【session】 【auth】 【csrf】

用户访问 : http://127.0.0.1:8000/index/ ，
页面显示： 【csrf】【auth】【session】 登录 【session】 【auth】 【csrf】

即：每个类都是对view中返回返回值的内容进行包装。
"""
"""
import importlib

MIDDLEWARE_CLASSES = [
    'utils.session.SessionMiddleware',
    'utils.auth.AuthMiddleware',
    'utils.csrf.CrsfMiddleware',
]

FUNC_LIST = list()
for path in MIDDLEWARE_CLASSES:
    class_path, class_name = path.rsplit('.', maxsplit=1)
    class_obj = importlib.import_module(class_path)
    cls = getattr(class_obj, class_name)
    obj = cls()
    FUNC_LIST.append(obj.func())
def decorator(func):
    def inner(*args, **kwargs):
        func_list_reverse = FUNC_LIST.copy()
        func_list_reverse.reverse()
        ret = '%s %s %s' % (' '.join(func_list_reverse), func(*args, **kwargs), ' '.join(FUNC_LIST))
        return ret
    return inner



from wsgiref.simple_server import make_server


class View(object):
    @decorator
    def login(self):
        return '登陆'
    @decorator
    def logout(self):
        return '登出'
    @decorator
    def index(self):
        return '首页'


def func(environ, start_response):
    start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
    obj = View()
    method_name = environ.get('PATH_INFO').strip('/')
    if not hasattr(obj, method_name):
        return ["Holle,World!".encode("utf-8"), ]
    response = getattr(obj, method_name)()
    return [response.encode("utf-8")]


server = make_server('127.0.0.1', 8000, func)
server.serve_forever()
"""
